package com.yu.Service;

import com.yu.DAO.*;
import com.yu.POJO.*;
import com.yu.tool.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;

import java.io.*;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * Created with IntelliJ IDEA.
 *
 * @Author: LittleFisher
 * @Date: 2021/05/31/19:45
 * @Description: MyJson msg:true/false操作成功还是失败,error String 错误信息
 */
@Service
public class AdminServiceImpl implements AdminService{
    @Autowired
    private AdminDao adminDao;
    @Autowired
    private StudentDao sd;
    @Autowired
    private StuInfoDao sid;
    @Autowired
    private clazzDao cd;
    @Autowired
    private deptDao dd;
    @Autowired
    private CourseDao CD;
    @Autowired
    private TeacherDao td;
    @Autowired
    private ScDao scd;
    @Autowired
    private NoticeDao nd;
    @Autowired
    private CCDao ccd;

    /**
     *  登录验证
     * @param name
     * @param password
     * @return MyJson
     */
    @Override
    public MyJson adminLogin(String name,String password) {
        MyJson myJson = new MyJson();
        Admin admin = adminDao.findAdminByName(name);
        if(admin==null){
            myJson.setMsg(false);
            myJson.setError("查无此人");
            return myJson;
        }
        if(password.equals(admin.getPassword())) {
            myJson.setMsg(true);
        }
        else {
            myJson.setMsg(false);
            myJson.setError("密码错误");
        }
        return myJson;
    }

    /**
     *  通过名字查找老师
     * @param name
     * @return MyJson
     */
    @Override
    public Admin getAdminByName(String name){
        return adminDao.findAdminByName(name);
    }

   //stu

    /**
     * 获取学生信息
     * @param page
     * @param rows
     * @return
     */
    @Override
    public pageTool getAllStuInfo(int page, int rows){
        pageTool pt = new pageTool();
        int total = sd.getStuTotal();
        int start= (page - 1) * rows;
        int end = start+rows;
        List<Student> list = sd.findAllStu(start,end);
        for (Student student:list) {
            student.setClazz(cd.findClazzByID(student.getClazz_id()));
            student.setStuInfo(sid.findStuInfoByID(student.getId()));
            student.clazz_InfoToStu();
        }
        pt.setTotal(total);
        pt.setRows(list);
        return pt;
    }

    /**
     *  查询一班的学生信息
     * @param page
     * @param rows
     * @param clazz_id
     * @return
     */
    @Override
    public pageTool getAllStuInfoWithClazz(int page, int rows,int clazz_id){
        pageTool pt = new pageTool();
        int total = 0;
        int start= (page - 1) * rows;
        int end = start+rows;
        List<Student> list = sd.findAllStuWithClazz(start,end,clazz_id);
        total = sd.getClazzTotal(clazz_id);
        for (Student student:list) {
            student.setClazz(cd.findClazzByID(student.getClazz_id()));
            student.setStuInfo(sid.findStuInfoByID(student.getId()));
            student.clazz_InfoToStu();
        }
        pt.setTotal(total);
        pt.setRows(list);
        return pt;
    }

    /**
     * 管理员删除学生通过学生id
     * @param id 学生id
     * @return MyJson
     */
    @Override
    //注意事务回滚
    @Transactional(propagation = Propagation.REQUIRED,
            isolation = Isolation.DEFAULT,readOnly = false
    )
    public MyJson adDelStuById(int id){
        MyJson myJson = new MyJson();

       if(sd.delUser(id)>0&sid.delStuInfo(id)>0){
           myJson.setMsg(true);
       }else {
           myJson.setMsg(false);
           try {
               throw new RuntimeException("插入失败数据库回滚");
           }catch (RuntimeException e){
               myJson.setError(e.getMessage());
               TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
           }
       }
        return myJson;
    }

    /**
     *  更新学生信息
     * @param stu 学生对象
     * @return MyJson
     */
    @Override
    //注意事务回滚
    @Transactional(propagation = Propagation.REQUIRED,
            isolation = Isolation.DEFAULT,readOnly = false
    )
    public MyJson adUpStuInfo(Student stu){
        MyJson myJson = new MyJson();

        if(!stu.getSno().equals(sd.findStuByID(stu.getId()).getSno())){
            if(sd.isSno(stu.getSno())!=null){
                myJson.setMsg(false);
                myJson.setError("学号重名");
                return myJson;
                //throw new MyException("学号重名");
            }
        }
        Clazz clazz_new = cd.findClazzByName(stu.getClazzName());

        if(clazz_new!=null&clazz_new.getId()!= stu.getClazz_id()){
            stu.setClazz_id(clazz_new.getId());//判断修改的班级id 是否发生改变如过改变就更新clazz_id
        }

        //StuInfo stuInfo = new StuInfo(36,"","d","s","d","d","s");//测试事务使用
        if(sd.updateStu(stu)>0&sid.updateStuInfo(stu.getStuInfo())>0){
            myJson.setMsg(true);
        }else {
            myJson.setMsg(false);
            try {
                throw new RuntimeException("插入失败数据库回滚");
            }catch (RuntimeException e){
                myJson.setError(e.getMessage());
                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            }
        }
        return myJson;
    }

    /**
     *  新增学生
     * @param stu 学生对象
     * @return MyJson
     */
    @Override
    @Transactional(propagation = Propagation.REQUIRED,
            isolation = Isolation.DEFAULT,readOnly = false
    )
    public MyJson adAddStu(Student stu){
        MyJson myJson = new MyJson();
        Clazz clazz= cd.findClazzByName(stu.getClazz().getName());
        stu.setClazz_id(clazz.getId());

        if(sd.isSno(stu.getSno())!=null){
            myJson.setMsg(false);
            myJson.setError("学号重名");
            return myJson;
        }

        if(sd.addStudent(stu)>0){
            stu.setId(sd.findStuIDBySno(stu.getSno()));
            stu.getStuInfo().setId(stu.getId());

            if(sid.addStuInfo(stu.getStuInfo())>0){
                myJson.setMsg(true);
            }else {
                myJson.setMsg(false);
                try {
                    throw new RuntimeException("插入失败，数据库回滚");
                }catch (RuntimeException e){
                    myJson.setError(e.getMessage());
                    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                }
            }
        }else {
            myJson.setMsg(false);

        }
        return myJson;
    }

    /**
     *  通过参数查询学生
     * @param str 参数
     * @return pageTool 查询结果集
     */
    @Override
    public pageTool getStuByStr(String str){
        pageTool pt = new pageTool();
        List<Student> list = new ArrayList<Student>();


        Clazz clazz= cd.findClazzByName(str);
        if(clazz!=null){//查询班级
            list = sd.getStuByClazz_id(clazz.getId());
        }else {
            list = sd.getStuByNameOrSno(str);//学生姓名或者学号
        }

        int total = list.size();

        for (Student student:list) {
            Clazz clazz1 = cd.findClazzByID(student.getClazz_id());
            if(clazz1!=null){
                student.setClazz(clazz1);
            }

            StuInfo stuInfo = sid.findStuInfoByID(student.getId());
            if(stuInfo!=null){
                student.setStuInfo(stuInfo);
            }

            student.clazz_InfoToStu();//转换 方便前端使用
        }

        pt.setTotal(total);
        pt.setRows(list);
        return pt;
    }

    /**
     *  班级加入某课程
     * @param clazz_id 班级id
     * @param course_id 课程id
     * @return
     */
    @Override
    @Transactional(propagation = Propagation.REQUIRED,
            isolation = Isolation.DEFAULT,readOnly = false
    )
    public MyJson clazzJoinCourse(int clazz_id, int course_id){
        //全部加入？可以优化
        MyJson myJson = new MyJson();
        if(cd.findClazzByID(clazz_id)==null){
            myJson.setMsg(false);
            myJson.setError("班级id不存在");
            return myJson;
        }
        if(CD.getCourseByID(course_id)==null){
            myJson.setMsg(false);
            myJson.setError("课程id不存在");
            return myJson;
        }

        CC cc = new CC();
        cc.setClazz_id(clazz_id);
        cc.setCourse_id(course_id);
        cc.setTea_id(CD.getCourseByID(course_id).getTea_id());

        List<Student> list = sd.getStuByClazz_id(clazz_id);//班级（id）的所有学生对象

        int all = 0;
        all = list.size();

        int count = 0;
        int other = 0;
        for (Student stu:list) {
            if(scd.CourseIsSelect(course_id,stu.getId())==null){//判断该学生是否已经在这个课了
                if(scd.addSC(course_id,stu.getId())>0){
                    count++;
                }
            }else {
                other++;
            }
        }

        cc.setNow_count(other+count);
        cc.setReal_count(all);

        if(other==all){
            if(ccd.findByPOJO(clazz_id,course_id)==null){
                if(ccd.addCC(cc)<0){
                    myJson.setMsg(false);
                    myJson.setError("数据库错误");
                    return myJson;
                }
            }else {
                if(ccd.upCount((count+other),all)<0){
                    myJson.setMsg(false);
                    myJson.setError("数据错误,数据回滚");
                    return myJson;
                }
            }
            myJson.setMsg(false);
            myJson.setError("该班已经全部加入该课程");
            return myJson;
        }

        if(count+other==all){
            if(ccd.findByPOJO(clazz_id,course_id)==null){
                if(ccd.addCC(cc)<0){
                    myJson.setMsg(false);
                    myJson.setError("数据库错误,数据回滚");
                    return myJson;
                }
            }else {
                if(ccd.upCount((count+other),all)<0){
                    myJson.setMsg(false);
                    myJson.setError("数据错误,数据回滚");
                    return myJson;
                }
            }
            myJson.setMsg(true);
        }else {
            myJson.setMsg(false);
            try {
                throw new RuntimeException("插入失败，数据库回滚");
            }catch (RuntimeException e){
                myJson.setError(e.getMessage());
                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            }
        }
        return myJson;
    }

    /**
     * 获取所有班级选课表
     * @return
     */
    @Override
    public List<CC> getAllCC(){
        return ccd.getAllCC();
    }

    //clazz

    /**
     *  获取所有班级
     * @return List<Clazz>
     */
    @Override
    public List<Clazz> getAllClazz(){
        List<Clazz> list = cd.findAllClazz();
        return list;
    }

    /**
     * 获取所有系
     * @return
     */
    @Override
    public List<Dept> getAllDept(){
        return dd.getAllDept();
    }

    /**
     *  删除班级
     * @param id 班级id
     * @return
     */
    @Override
    public  MyJson adDelClazz(int id){
        MyJson myJson = new MyJson();

        if(cd.delClazz(id)>0){
            myJson.setMsg(true);
        }else {
            myJson.setMsg(false);
            myJson.setError("数据库错误，删除失败");
        }
        return myJson;
    }

    /**
     *  新增班级
     * @param clazz
     * @return
     */
    @Override
    public MyJson adAddClazz(Clazz clazz){
        //重名问题
        MyJson myJson = new MyJson();

        Clazz clazz1 = new Clazz();
        clazz1.setName(clazz.getName());

        List list = cd.findClazzByPojo(clazz1);
        if(list.size()!=0){
            myJson.setMsg(false);
            myJson.setError("班级重名");
            return myJson;
        }

        if(cd.addClazz(clazz)>0){
            myJson.setMsg(true);
        }else {
            myJson.setMsg(false);
        }
        return myJson;
    }

    /**
     *  修改班级
     * @param clazz 班级对象
     * @return
     */
    @Override
    public MyJson adUpClazz(Clazz clazz){
        MyJson myJson = new MyJson();
        if(cd.findClazzByID(clazz.getId()).getName().equals(clazz.getName())){
            //名字没变
        }else {
            Clazz clazz1 = new Clazz();
            clazz1.setName(clazz.getName());

            List list = cd.findClazzByPojo(clazz1);
            System.out.println(list);
            if(list.size()!=0){
                myJson.setMsg(false);
                myJson.setError("班级重名");
                return myJson;
            }
        }

        if(cd.updateClazz(clazz)>0){
            myJson.setMsg(true);
        }else {
            myJson.setMsg(false);
            myJson.setError("数据库错误更新失败");
        }
        return myJson;
    }

    //course

    /**
     *  获取所有课程
     * @param page
     * @param rows
     * @return
     */
    @Override
    public pageTool getAllCourse(int page, int rows){
        pageTool pt = new pageTool();
        int total = CD.getCourseTotal();
        int start= (page - 1) * rows;
        int end = start+rows;
        List<Course> list = CD.getAllCourse(start,end);
        for (Course course:list) {
            Teacher tea = td.findTeacherById(course.getTea_id());
            if(tea!=null){
                course.setTea_name(tea.getName());
            }
        }

        pt.setTotal(total);
        pt.setRows(list);
        return pt;
    }

    /**
     *  删除课程
     * @param id 课程id
     * @return
     */
    @Override
    public MyJson delCourse(int id){
        MyJson myJson = new MyJson();
        if(CD.delCourse(id)>0){
            myJson.setMsg(true);
        }else {
            myJson.setMsg(false);
            myJson.setError("数据库错误更新失败");
        }
        return myJson;
    }

    /**
     *  更新课程
     * @param course
     * @return
     */
    @Override
    public MyJson upCourse(Course course){
        MyJson myJson = new MyJson();
        course.setTea_id(td.findTeaByName(course.getTea_name()).getId());

        if(CD.getCourseByID(course.getId()).getName().equals(course.getName())){
            //名字不变
        }else {
            Course course1 = new Course();
            course1.setName(course.getName());
            if(CD.findCourseByPojo(course1).size()!=0){
                myJson.setMsg(false);
                myJson.setError("课程重名");
                return myJson;
            }
        }

        if(CD.updateCourse(course)>0){
            myJson.setMsg(true);
        }else {
            myJson.setMsg(false);
        }
        return myJson;
    }

    /**
     * 新增课程
     * @param course
     * @return
     */
    @Override
    public MyJson addCourse(Course course){
        //重名
        MyJson myJson = new MyJson();
        course.setTea_id(td.findTeaByName(course.getTea_name()).getId());

        Course course1 = new Course();
        course1.setName(course.getName());
        if(CD.findCourseByPojo(course1).size()!=0){
            myJson.setMsg(false);
            myJson.setError("课程重名");
            return myJson;
        }
        if(CD.addCourse(course)>0){
            myJson.setMsg(true);
        }else {
            myJson.setMsg(false);
            myJson.setError("数据库错误");
        }
        return myJson;
    }

    /**
     *  获取所有必修课
     * @param page
     * @param rows
     * @param c_type 必修课
     * @return
     */
    @Override
    public pageTool getRequiredCourse(int page, int rows,String c_type){
        pageTool pt = new pageTool();
        int start= (page - 1) * rows;
        int end = start+rows;
        Date date = new Date();
        SimpleDateFormat df = new SimpleDateFormat("yyyy");
        String year = df.format(date);
        int nextYear = Integer.parseInt(year)+1;
        String c_year = year+"-"+nextYear;
        int total = CD.getCourseTotalByType(c_type,c_year);
        List<Course> list = CD.getAllCourseByType(start,end,c_type,c_year);
        for (Course course:list) {
            course.setTea_name(td.findTeacherById(course.getTea_id()).getName());
        }
        pt.setTotal(total);
        pt.setRows(list);
        return pt;
    }

    /**
     *  所有学生选课
     * @param page
     * @param rows
     * @return
     */
    @Override
    public pageTool getAllSC(int page,int rows){
        pageTool pt = new pageTool();
        int start= (page - 1) * rows;
        int end = start+rows;
        List<Sc> list = scd.getAllSC(start,end);
        for (Sc sc:list) {
            if(sd.findStuByID(sc.getStu_id())!=null){
                sc.setStu_name(sd.findStuByID(sc.getStu_id()).getName());
            }
            if(CD.getCourseByID(sc.getCourse_id())!=null){
                sc.setCourse_name(CD.getCourseByID(sc.getCourse_id()).getName());
            }
        }
        pt.setTotal(scd.getSCTotal());
        pt.setRows(list);
        return pt;
    }

    //teacher

    /**
     *  获取所有老师信息
     * @return
     */
    @Override
    public List<Teacher> getAllTea(){
        return td.getAllTea();
    }

    @Override
    public MyJson delTea(int id){
        MyJson myJson = new MyJson();
        if(td.delTea(id)>0){
            myJson.setMsg(true);
        }else {
            myJson.setMsg(false);
        }
        return myJson;
    }

    /**
     *  修改老师信息
     * @param teacher
     * @return
     */
    @Override
    public MyJson upTea(Teacher teacher){
        MyJson myJson = new MyJson();
        if(td.findTeaByName2(teacher.getName(),teacher.getId())!=null){
            //重名确定
            teacher.setName(teacher.getName()+teacher.getId());//重名则加上id
        }
        if(td.upTea(teacher)>0){
            myJson.setMsg(true);
        }else {
            myJson.setMsg(false);
            myJson.setError("数据库错误更新失败");
        }
        return myJson;
    }

    /**
     *  新增老师
     * @param teacher
     * @return
     */
    @Override
    public MyJson addTea(Teacher teacher){
        MyJson myJson = new MyJson();
        if(td.findTeaByName(teacher.getName())!=null){
            //重名确定
            teacher.setName(teacher.getName()+teacher.getId());//重名则加上id
        }
        if(td.addTea(teacher)>0){
            myJson.setMsg(true);
        }else {
            myJson.setMsg(false);
            myJson.setError("数据库错误更新失败");
        }
        return myJson;
    }

    /**
     *  获取所有老师
     * @param page
     * @param rows
     * @return
     */
    @Override
    public pageTool getAllTeaWithPage(int page, int rows){
        pageTool pt = new pageTool();
        int total = td.getAllTea().size();
        int start= (page - 1) * rows;
        int end = start+rows;
        List<Teacher> list = td.getAllTeaWithPage(start,end);
        pt.setTotal(total);
        pt.setRows(list);
        return pt;
    }

    //notice

    /**
     * 获取所有公告
     * @return
     */
    @Override
    public List<Notice> getAllNotice(){
        List<Notice> list = nd.getAllNotice();
        return list;
    }

    /**
     *  保存公告
     * @param notice 公告
     * @return
     */
    @Override
    public MyJson saveNews(Notice notice) {
        MyJson myJson = new MyJson();

        if(nd.addNotice(notice)>0){
            myJson.setMsg(true);
        }else {
            myJson.setMsg(false);
            myJson.setError("数据库错误");
        }
        return myJson;
    }

    /**
     *  删除通告
     * @param id 通告id
     * @return
     */
    @Override
    public MyJson AdDelNotice(int id) {
        MyJson myJson = new MyJson();
        if(nd.delNotice(id)>0){
            myJson.setMsg(true);
        }else {
            myJson.setMsg(false);
            myJson.setError("数据库错误");
        }
        return myJson;
    }

    /**
     *  通过id 获取通告
     * @param id 通告id
     * @return
     */
    @Override
    public Notice getNewsById(int id){
        Notice notice = nd.getNoticeById(id);
        return notice;
    }


    /** 弃用
     * 保存公告
     * @param str 公告内容
     * @param title 公告标题
     * @return
     */
    /*
    @Override
    public MyJson saveNews(String str,String title){
        MyJson myJson = new MyJson();

        String savePath = "C:\\Users\\22531\\Desktop\\news\\";
        //保存路径

        FileOutputStream fos = null;
        File file = new File(savePath+title+".txt");

        File saveFile = null;
        String name = "";
        if(file.exists()){
            String newTitle = title+new Date().getTime();
            name = newTitle;
            saveFile = new File(savePath + newTitle+".txt");
        }else {
            saveFile = new File(savePath+title+".txt");
            name = title;
        }

        try {
            fos = new FileOutputStream(saveFile, true);
        } catch (FileNotFoundException e) {
            myJson.setMsg(true);
            e.printStackTrace();
        }

        OutputStreamWriter osw = null;
        BufferedWriter br = null;
        try {
            osw = new OutputStreamWriter(fos,"UTF-8");
            br = new BufferedWriter(osw);
            try {
                br.write(str);
                br.write("\n");
                br.flush();
                Notice notice = new Notice();
                notice.setName(name);
                notice.setTitle(title);
                if(nd.addNotice(notice)>0){
                    myJson.setMsg(true);
                }else {
                    myJson.setMsg(false);
                }

            } catch (IOException e1) {
                myJson.setMsg(false);
                e1.printStackTrace();
            }
        }catch (UnsupportedEncodingException e2) {
            myJson.setMsg(false);
            e2.printStackTrace();
        }
        return myJson;
    }*/

  /*  @Override
    public MyJson AdDelNotice(int id){
        MyJson myJson = new MyJson();
        String savePath = "C:\\Users\\22531\\Desktop\\news\\";

        File file = new File(savePath+nd.getNoticeById(id).getName()+".txt");
        System.out.println(file);
        if(file.exists()) {
            System.out.println(1);
            if(file.delete()){
                System.out.println(2);
                if(nd.delNotice(id)>0){
                    myJson.setMsg(true);
                }else {
                    myJson.setMsg(false);
                }
            }else {
                myJson.setMsg(false);
            }

        }else {
            myJson.setMsg(false);
        }
        System.out.println(myJson);
        return myJson;
    }*/
}
